package cn.it.shop.action;

import java.io.InputStream;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import cn.it.shop.model.FileImage;
import cn.it.shop.service.AccountService;
import cn.it.shop.service.CategoryService;
import cn.it.shop.service.EmailUtil;
import cn.it.shop.service.ForderService;
import cn.it.shop.service.MessageUtil;
import cn.it.shop.service.PayService;
import cn.it.shop.service.ProductService;
import cn.it.shop.service.SorderService;
import cn.it.shop.service.UserService;
import cn.it.shop.utils.FileUpload;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

@Controller("baseAction")
@Scope("prototype")
//因为有很多不同的model都需要使用ModelDriven，所以这里使用泛型 
public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T>{ 
	
		/*
		 * 有人可能会问，BaseAction中注入了那么多service对象的话不会冗余么？这是不会的，因为就算不写在BaseAction中，
		 * Spring容器也是会创建这个对象的，这点没有关系，相反，service对象全放在BaseAction中更加便于其他Action的开发，
		 * 而且BaseAction不需要配到struts.xml文件中，因为根本就没有哪个JSP会请求BaseAction，它只是让其他Action来继承用的。
		 * 还有一点别忘了：那就是修改在application.xml中的配置,增加baseaction相应的bean
		 */
	
	/*
	 *  因为type是Category类的一个属性，我们在BaseAction中已经实现了ModelDriven<Category>接口，
	 *  所以这个type会被封装到model中，我们不需要管它，可以通过model来获取，但是EasyUI自动发过来的page和rows参数我们需要自己获取了，
	 *  所以我们可以在BaseModel中增加两个成员变量page和rows并实现get和set方法，最后还要考虑一点，这些参数都获得了后，
	 *  我们根据这些参数去数据库中查询数据，那么我们查出来的数据放到哪呢？而且还要打包成json格式发到前台才能被DataGrid显示。
	 *  我们先不考虑将查询到的数据如何打包成json格式，我们先考虑把这些数据放到一个地方，很自然的想到了使用Map，
	 *  因为json格式的数据就是key-value形式的。想到这里，我们继续完善BaseAction：
	 */
	
	
    //封装了图片信息的类  
    protected FileImage fileImage;  
      
    //上传文件工具类  
    @Resource  
    protected FileUpload fileUpload;  
  
    public FileImage getFileImage() {  
        return fileImage;  
    }  
    public void setFileImage(FileImage fileImage) {  
        this.fileImage = fileImage;  
    }  
	
	
	
		protected Integer page;
		protected Integer rows;
		protected Map<String,Object> pageMap = null;
		
		//用来装有将要被打包成json格式返回给前台的数据，下面要实现get方法
		protected List<T> jsonList = null;
		
		// service对象
		@Resource
		protected CategoryService categoryService;
		@Resource
		protected AccountService accountService;
		@Resource
		protected ProductService productService;
		
	    @Resource  
	    protected ForderService forderService;  
	    @Resource  
	    protected SorderService sorderService;  
	    
	    @Resource 
	    protected UserService userService;
	    
	    @Resource 
	    protected PayService payService;
	    
	    @Resource
	    protected EmailUtil emailUtil;
	    
	    @Resource
	    protected MessageUtil messageUtil;
	    

		public void setCategoryService(CategoryService categoryService) {
			this.categoryService = categoryService;
		}

		public void setAccountService(AccountService accountService) {
			this.accountService = accountService;
		}
		
		public void setProductService(ProductService productService) {
			this.productService = productService;
		}
		
		
		
	
		//后面所有要使用request、session和application域的Action，只要直接继承BaseAction即可，非常方便。


		public UserService getUserService() {
			return userService;
		}
		public void setUserService(UserService userService) {
			this.userService = userService;
		}



		protected Map<String, Object> request;  
		protected Map<String, Object> session;  
		protected Map<String, Object> application;  
	    
	    
	    protected T model;  
	    
		
		//获取要删除的ids，要有get和set方法  
	    //流是用来向前台返回数据的，这个数据是让struts获取的，然后通过流的形式传到前台，所以实现get方法即可  
		protected String ids;
		protected InputStream inputStream; 
		
		public String getIds() {
			return ids;
		}

		public InputStream getInputStream() {
			return inputStream;
		}

		public void setIds(String ids) {
			this.ids = ids;
		}
	    

		@Override
		public void setApplication(Map<String, Object> application) {
			this.application = application;
			
		}

		@Override
		public void setSession(Map<String, Object> session) {
			 this.session = session; 
			
		}

		@Override
		public void setRequest(Map<String, Object> request) {
			this.request = request; 
			
		}

		@Override
		public T getModel() {
			ParameterizedType type =(ParameterizedType)this.getClass().getGenericSuperclass();
			Class clazz = (Class)type.getActualTypeArguments()[0];
			try {
				model = (T) clazz.newInstance();
			} catch (Exception e) {
				throw new RuntimeException();
			}
			return model;
		}

		public void setModel(T model) {
			this.model = model;
		}

		public Integer getPage() {
			return page;
		}

		public void setPage(Integer page) {
			this.page = page;
		}

		public Integer getRows() {
			return rows;
		}

		public void setRows(Integer rows) {
			this.rows = rows;
		}

		public Map<String, Object> getPageMap() {
			return pageMap;
		}

		public void setPageMap(Map<String, Object> pageMap) {
			this.pageMap = pageMap;
		}

		public List<T> getJsonList() {
			return jsonList;
		}

		public void setJsonList(List<T> jsonList) {
			this.jsonList = jsonList;
		}  
		
		
		
}
